In [1]:
# nbconvert-ignore

# === Helper to embed Plotly figures directly in HTML exports ===
import plotly.io as pio
from IPython.display import HTML

# Fallback renderer helps when exporting via nbconvert
pio.renderers.default = "plotly_mimetype"

def show_embed(fig):
    return HTML(pio.to_html(fig, include_plotlyjs='inline', full_html=False))

📈 Projet — Évolution des ETF visant le secteur de l'énergie

Énergies fossiles Renouvelables Tech de Stockage
🎯 Objectif
Aider un investisseur (avec peu d'expérience) souhaitant se positionner sur les marchés financiers dans le secteur de l’énergie, en identifiant les dynamiques de performance et de stabilité des principaux ETF énergétiques.
❓ Problématique
Quel type d’énergie, fossile, renouvelable ou stockage offre aujourd’hui le meilleur compromis entre rendement et stabilité pour un investisseur souhaitant se positionner sur le secteur de l’énergie ?
🧭 Plan
  1. Introduction rapide et présentation des données utilisées
  2. Analyse des rendements des ETF
  3. Évolution normalisée en base 100
  4. Corrélations sur les différentes périodes
  5. Analyse graphique volatilité / rendement

🔹 Introduction

Au cours des dernières années, la transition énergétique est devenue un enjeu économique majeur. Les investisseurs se tournent de plus en plus vers des fonds indiciels (ETF) liés aux énergies renouvelables, tout en restant attentifs à la performance des énergies fossiles et aux nouvelles technologies comme les technologies de stockage.

Qu’est-ce qu’un ETF ?
Un Exchange Traded Fund (ETF) est un fonds indiciel coté en bourse qui réplique la performance d’un indice (par exemple, un secteur, une zone géographique ou une thématique). Il permet aux investisseurs d’obtenir une exposition diversifiée à moindre coût.
Voici les 3 ETF de la base de données :
  • IXC — Énergies fossiles (pétrole et gaz)
  • ICLN — Énergies renouvelables
  • LIT — Stockage de l’énergie (batteries lithium)
Périmètre temporel de l’analyse :
De 2015 à 2024, en distinguant les périodes avant, pendant et après la crise du Covid-19.
Objectif final
Fournir des pistes de réflexion pour un investisseur souhaitant diversifier son portefeuille dans le secteur de l’énergie, en identifiant les classes d’actifs les plus performantes et/ou les plus stables sur la période récente.
In [2]:
#Importation des librairies nécessaires

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import seaborn as sns
import numpy as np
In [3]:
#Télécharger les cours des ETF

tickers = ['IXC','ICLN','LIT']
data = yf.download(tickers, start='2015-01-01', end='2024-12-31')
data = data['Close']
#Afficher les premières lignes des données
print(data.head())
C:\Users\Victor\AppData\Local\Temp\ipykernel_5936\2166598355.py:4: FutureWarning:

YF.download() has changed argument auto_adjust default to True

[*********************100%***********************]  3 of 3 completed
Ticker          ICLN        IXC        LIT
Date                                      
2015-01-02  8.039236  24.319496  19.526278
2015-01-05  7.866085  23.254177  19.109718
2015-01-06  7.849592  22.986208  19.109718
2015-01-07  7.923801  23.051567  19.109718
2015-01-08  8.113444  23.541750  19.335352

In [4]:
#vérifier les données manquantes
print(data.isnull().sum())
Ticker
ICLN    0
IXC     0
LIT     0
dtype: int64
In [5]:
#Calculer les rendements quotidiens
returns = data.pct_change().dropna()
print(returns.head())
Ticker          ICLN       IXC       LIT
Date                                    
2015-01-05 -0.021538 -0.043805 -0.021333
2015-01-06 -0.002097 -0.011523  0.000000
2015-01-07  0.009454  0.002843  0.000000
2015-01-08  0.023933  0.021265  0.011807
2015-01-09 -0.003049 -0.008884 -0.000897

🔹 Rendements quotidiens des ETF

Cette section met en évidence l’évolution des rendements journaliers des trois ETF liés à l’énergie : IXC (énergies fossiles), ICLN (énergies renouvelables) et LIT (technologies de stockage et batteries). L’objectif est de comparer leur dynamique de variation au fil du temps et de voir comment chaque segment réagit aux différentes phases du marché énergétique.

In [6]:
import plotly.express as px

# Mise au format long pour Plotly
returns_long = returns[['IXC', 'ICLN', 'LIT']].reset_index().melt(
    id_vars='Date',
    value_vars=['IXC', 'ICLN', 'LIT'],
    var_name='ETF',
    value_name='Rendement'
)

# Mapping pour noms lisibles
mapping_energie = {
    'IXC': 'Énergies fossiles',
    'ICLN': 'Énergies renouvelables',
    'LIT': 'Technologies de stockage'
}
returns_long['Type d’énergie'] = returns_long['ETF'].map(mapping_energie)

# Couleurs harmonisées (identiques à tes autres visuels)
couleurs = {
    'Énergies fossiles': '#f59e0b',
    'Énergies renouvelables': '#16a34a',
    'Technologies de stockage': '#2563eb'
}

# Graphique interactif
fig = px.line(
    returns_long,
    x='Date',
    y='Rendement',
    color='Type d’énergie',
    color_discrete_map=couleurs,
    title="<b>Évolution des rendements quotidiens</b> — Comparaison <b>Fossiles / Renouvelables / Stockage</b>",
    labels={'Date': 'Année', 'Rendement': 'Rendement quotidien'}
)

# Masquer toutes les courbes au démarrage
fig.for_each_trace(lambda t: t.update(visible='legendonly'))

#  Mise en page et design
fig.update_layout(
    template='plotly_white',
    title_x=0.5,
    font=dict(size=13, family='Inter, Arial, sans-serif', color='#1f2937'),
    plot_bgcolor='#f5f5f5',
    paper_bgcolor='white',
    height=500,
    margin=dict(l=40, r=40, t=80, b=70),

    # ✅ Légende claire et cohérente
    legend=dict(
        title=dict(
            text='<b>Type d’énergie</b>',
            font=dict(size=13, color='#1f2937')
        ),
        font=dict(size=12.5, color='#374151', family='Inter, Arial, sans-serif'),
        orientation="h",
        y=-0.28,
        x=0.25,
        bgcolor='rgba(255,255,255,0.65)',
        bordercolor='rgba(0,0,0,0.05)',
        borderwidth=1
    )
)

# Ajout d’une note d’instruction
fig.add_annotation(
    text="💡 Cliquez sur la légende pour afficher ou masquer les courbes",
    xref="paper", yref="paper",
    x=0.5, y=-0.22,
    showarrow=False,
    font=dict(color="gray", size=12)
)

# Grilles plus subtiles
fig.update_xaxes(showgrid=True, gridcolor='#d0d0d0', zeroline=False)
fig.update_yaxes(showgrid=True, gridcolor='#d0d0d0', zeroline=False)

show_embed(fig)
Out[6]:

En résumé : les rendements présentent une forte instabilité pendant la période Covid, marquée par des fluctuations quotidiennes importantes. On remarque cependant que l’ETF pétrolier (IXC) a connu le pic le plus faible en termes de rendement quotidien, alors que l’ETF ICLN (renouvelables) s’est montré beaucoup plus volatil. Ces différences traduisent la réactivité contrastée des marchés énergétiques face à la crise.

🔹 Évolution normalisée en base 100

Cette section met en perspective l’évolution des trois ETF énergétiques, IXC (énergies fossiles), ICLN (énergies renouvelables) et LIT (technologies de stockage), après une normalisation en base 100.

Cette méthode permet de comparer directement leur performance relative, sans tenir compte du prix de départ, et de mieux visualiser comment les trajectoires de chaque secteur ont divergé au fil du temps. On peut ainsi observer plus clairement les différences de dynamique entre fossiles, renouvelables et stockage d’énergie sur l’ensemble de la période étudiée.

In [7]:
import plotly.express as px
import pandas as pd

# Normalisation base 100
normalized = data / data.iloc[0] * 100

# Mise au format long pour Plotly
normalized_long = normalized.reset_index().melt(
    id_vars='Date',
    value_vars=['IXC', 'ICLN', 'LIT'],
    var_name='ETF',
    value_name='Indice (Base 100)'
)

# Mapping pour noms lisibles
mapping_energie = {
    'IXC': 'Énergies fossiles',
    'ICLN': 'Énergies renouvelables',
    'LIT': 'Technologies de stockage'
}
normalized_long['Type d’énergie'] = normalized_long['ETF'].map(mapping_energie)

# Couleurs harmonisées
couleurs = {
    'Énergies fossiles': '#f59e0b',
    'Énergies renouvelables': '#16a34a',
    'Technologies de stockage': '#2563eb'
}

# Graphique
fig = px.line(
    normalized_long,
    x='Date',
    y='Indice (Base 100)',
    color='Type d’énergie',

    color_discrete_map=couleurs,
    title="<b>Évolution normalisée (base 100)</b> — Comparaison <b>Fossiles / Renouvelables / Stockage</b>",
    labels={'Date': 'Année', 'Indice (Base 100)': 'Indice (Base 100)'}
)


# Mise en forme générale
fig.update_layout(
    template='plotly_white',
    plot_bgcolor='#f5f5f5',
    paper_bgcolor='white',
    title_x=0.5,
    font=dict(size=13, family='Inter, Arial, sans-serif', color='#1f2937'),
    
    # ✅ Légende lisible et esthétique
    legend=dict(
        title=dict(
            text='<b>Type d’énergie</b>',
            font=dict(size=13, color='#1f2937')
        ),
        font=dict(size=12.5, color='#374151', family='Inter, Arial, sans-serif'),
        orientation="h",
        y=-0.25,
        x=0.25,
        bgcolor='rgba(255,255,255,0.65)',
        bordercolor='rgba(0,0,0,0.05)',
        borderwidth=1
    ),
    height=600,
    margin=dict(l=40, r=40, t=80, b=60)
)

# Grilles légères
fig.update_xaxes(showgrid=True, gridcolor='#d0d0d0', zeroline=False)
fig.update_yaxes(showgrid=True, gridcolor='#d0d0d0', zeroline=False)

show_embed(fig)
Out[7]:

En résumé : on observe que les énergies renouvelables et les technologies de stockage ont connu une hausse spectaculaire en 2020, avec un indice qui a triplé sur l’année. À l’inverse, l’ETF pétrolier (IXC) a subi une baisse marquée, tombant autour de 40 points (en base 100) au plus fort de la crise. Cette évolution illustre parfaitement la divergence de trajectoire entre énergies fossiles et “nouvelles technologies” face aux chocs .

🔹 Analyse des corrélations par périodes

On examine ici les corrélations entre les rendements des ETF énergétiques (IXC, ICLN et LIT) au cours de trois périodes distinctes : avant, pendant et après la crise du Covid-19. L’objectif est d’observer comment les relations entre les différentes formes d’énergie ont évolué dans le temps, en mettant en évidence les phases de corrélation élevée (marchés synchronisés) et de décorrélation (diversification accrue).

In [8]:
# 3 périodes
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go

# ---  Séparer les périodes ---
data_pre_covid = data[data.index < '2020-01-01']
data_covid = data[(data.index >= '2020-01-01') & (data.index < '2021-01-01')]
data_post_covid = data[data.index >= '2021-01-01']

# ---  Calcul des rendements journaliers ---
returns_pre_covid = data_pre_covid.pct_change().dropna()
returns_covid = data_covid.pct_change().dropna()
returns_post_covid = data_post_covid.pct_change().dropna()

# ---  Corrélations ---
rename_map = {
    'ICLN': 'Renouvelables',
    'IXC': 'Fossiles',
    'LIT': 'Stockages'
}
corr_pre_covid = returns_pre_covid.corr().rename(index=rename_map, columns=rename_map).round(2)
corr_covid     = returns_covid.corr().rename(    index=rename_map, columns=rename_map).round(2)
corr_post_covid= returns_post_covid.corr().rename(index=rename_map, columns=rename_map).round(2)

# ---  Figure responsive (pas de width/height fixes) ---
fig = make_subplots(
    rows=1, cols=3,
    subplot_titles=("Avant Covid (2015-2020)", "Pendant Covid (2020)", "Après Covid (2021-2025)"),
    horizontal_spacing=0.08  # un peu plus serré pour tenir dans le conteneur
)

# ---  Heatmaps  ---
heatmap_pre = go.Heatmap(
    z=corr_pre_covid.values, x=corr_pre_covid.columns, y=corr_pre_covid.index,
    text=corr_pre_covid.values, texttemplate="%{text:.2f}",
    colorscale="RdBu_r", zmin=-1, zmax=1,
    colorbar=dict(title="Corrélation", x=1.02, len=0.85, thickness=14, xpad=8)
)
heatmap_covid = go.Heatmap(
    z=corr_covid.values, x=corr_covid.columns, y=corr_covid.index,
    text=corr_covid.values, texttemplate="%{text:.2f}",
    colorscale="RdBu_r", zmin=-1, zmax=1,
    showscale=False
)
heatmap_post = go.Heatmap(
    z=corr_post_covid.values, x=corr_post_covid.columns, y=corr_post_covid.index,
    text=corr_post_covid.values, texttemplate="%{text:.2f}",
    colorscale="RdBu_r", zmin=-1, zmax=1,
    showscale=False
)

fig.add_trace(heatmap_pre,   row=1, col=1)
fig.add_trace(heatmap_covid, row=1, col=2)
fig.add_trace(heatmap_post,  row=1, col=3)

# --- Mise en forme (sans dimensions fixes) ---
fig.update_layout(
    title_text="<b>Comparaison des corrélations des rendements journaliers avant, pendant et après Covid</b>",
    title_x=0.5,
    title_font=dict(size=16),
    margin=dict(l=40, r=40, t=60, b=40),
    plot_bgcolor="white",
)
# --- Police un peu plus petite pour tenir sur petite largeur ---
fig.update_xaxes(tickfont=dict(size=11))
fig.update_yaxes(tickfont=dict(size=11))



show_embed(fig)
Out[8]:

En résumé : avant la crise Covid, les corrélations entre les trois ETF restaient limitées, chaque segment évoluait de manière indépendante. En 2020, la corrélation grimpe nettement, preuve d’une réaction commune face au choc global. Après 2021, les corrélations diminuent à nouveau, marquant un retour à des dynamiques sectorielles différenciées.

🔹 Analyse de la volatilité

Étude comparative de la volatilité annuelle et du profil de risque des ETF énergétiques (IXC, ICLN, LIT), pour identifier les actifs les plus stables sur la période post-Covid.

In [9]:
import pandas as pd
import plotly.express as px

# 1) Volatilité annualisée (post-Covid) — en %
volatilite = returns_post_covid.std() * (252 ** 0.5)  # annualisée
vol_df = pd.DataFrame({
    "Type d'énergie": ["Énergies fossiles", "Renouvelables", "Batteries/ Métaux stratégiques"],
    "Volatilité annuelle (%)": (volatilite[['IXC','ICLN','LIT']].reindex(['IXC','ICLN','LIT']).values * 100).round(2),
    "Ticker": ["IXC", "ICLN", "LIT"]
})

# 2) Tri décroissant pour lecture immédiate
vol_df = vol_df.sort_values("Volatilité annuelle (%)", ascending=False).reset_index(drop=True)

# 3) Palette cohérente avec le reste du notebook
couleurs = {
    "Énergies fossiles": "#f59e0b",              # orange (IXC)
    "Renouvelables": "#16a34a",                  # vert (ICLN)
    "Batteries/ Métaux stratégiques": "#2563eb"  # bleu (LIT)
}

# 4) Graphique
fig = px.bar(
    vol_df,
    x="Type d'énergie",
    y="Volatilité annuelle (%)",
    color="Type d'énergie",
    color_discrete_map=couleurs,
    hover_data={"Ticker": True, "Volatilité annuelle (%)": ':.2f', "Type d'énergie": False},
    title="<b>Volatilité annualisée des ETF énergétiques</b><br><span style='font-size:12px;color:#6b7280;'>Période post-Covid (annualisée, %) — lecture facilitée</span>",
)

# 5) Rendre les valeurs lisibles et garder l’ordre trié
fig.update_traces(
    texttemplate="%{y:.2f}%",
    textposition="outside",
    hovertemplate="<b>%{customdata[0]}</b> — %{x}<br>Volatilité : %{y:.2f}%<extra></extra>"
)

# 6) Mise en forme : fond + grilles + légende
fig.update_layout(
    template="plotly_white",
    plot_bgcolor="#f5f5f5",     # fond de la zone de tracé
    paper_bgcolor="white",
    title_x=0.5,
    font=dict(size=13),
    showlegend=False,           # inutile ici (couleur = libellé des barres)
    margin=dict(l=60, r=40, t=80, b=60),
    uniformtext_minsize=10,
    uniformtext_mode="hide",
    xaxis=dict(
        categoryorder="array",
        categoryarray=vol_df["Type d'énergie"].tolist(),
        title=None
    ),
    yaxis=dict(
        title="Volatilité annualisée (%)",
        rangemode="tozero"
    ),
    height=480
)

# 7) Grilles visibles
fig.update_xaxes(showgrid=True, gridcolor="#d0d0d0", zeroline=False)
fig.update_yaxes(showgrid=True, gridcolor="#d0d0d0", zeroline=False)

# 8) Ligne de référence : moyenne des 3
moy = vol_df["Volatilité annuelle (%)"].mean().round(2)
fig.add_hline(
    y=moy, line_dash="dot", line_color="#6b7280",
    annotation_text=f"Moyenne : {moy:.2f}%", annotation_position="top left",
    annotation_font=dict(size=11, color="#6b7280")
)

show_embed(fig)
Out[9]:

En résumé : après la période Covid, la volatilité des rendements diminue nettement par rapport à la période précédente (~50%), signe d’un retour progressif à la stabilité sur les marchés de l’énergie. Les ETF renouvelables restent toutefois un peu plus instables que les fossiles, reflet d’un secteur encore sensible aux décisions politiques et aux annonces environnementales. Enfin, les technologies de stockage affichent la volatilité la plus marquée, liée au rebond qui a suivi leur forte hausse pendant les politiques de relance mondiale.

🔹 Analyse du ratio rendement / volatilité sur les trois périodes

Cette section évalue le rapport rendement / risque des ETF énergétiques (IXC, ICLN et LIT) sur les trois périodes de l’étude avant, pendant et après la crise du Covid afin d’identifier quels actifs offrent la meilleure efficacité risque / performance.

In [10]:
import pandas as pd
import numpy as np
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go

# --- Calculs annuels (inchangés) ---
moy_rendement1 = returns_pre_covid.mean() * 252
moy_rendement2 = returns_covid.mean() * 252
moy_rendement3 = returns_post_covid.mean() * 252

volatilite1 = returns_pre_covid.std() * (252 ** 0.5)
volatilite2 = returns_covid.std() * (252 ** 0.5)
volatilite3 = returns_post_covid.std() * (252 ** 0.5)

# --- Associer les ETF à leur type d'énergie ---
mapping_energie = {
    'IXC': 'Fossiles',
    'ICLN': 'Renouvelables',
    'LIT': 'Stockages/ Batteries'
}

# --- Construction des DataFrames ---
def construire_df(moy, vol):
    return pd.DataFrame({
        "ETF": moy.index,
        "Type d'énergie": [mapping_energie[t] for t in moy.index],
        "Rendement annuel (%)": (moy.values * 100).round(2),
        "Volatilité annuelle (%)": (vol.values * 100).round(2),
        "Taille": np.abs(moy.values * 100)
    })

df_pre = construire_df(moy_rendement1, volatilite1)
df_pendant = construire_df(moy_rendement2, volatilite2)
df_post = construire_df(moy_rendement3, volatilite3)

# --- Création des 3 scatter plots ---
def create_scatter(df, titre):
    fig = px.scatter(
        df,
        x="Volatilité annuelle (%)",
        y="Rendement annuel (%)",
        size="Taille",
        color="Type d'énergie",
        text="ETF",
        hover_name="Type d'énergie",
        color_discrete_map={
            "Renouvelables": "#00CC96",
            "Fossiles": "#EF553B",
            "Batteries": "#636EFA"
        },
        title=titre
    )
    fig.update_traces(
        textposition="top center",
        marker=dict(line=dict(width=1, color='black')),
        opacity=0.85
    )
    return fig

fig_pre = create_scatter(df_pre, "Avant Covid (2015–2020)")
fig_pendant = create_scatter(df_pendant, "Pendant Covid (2020)")
fig_post = create_scatter(df_post, "Après Covid (2021–2025)")

# --- Création du subplot global ---
fig = make_subplots(
    rows=1, cols=3,
    subplot_titles=("Avant Covid (2015–2020)", "Pendant Covid (2020)", "Après Covid (2021–2025)"),
    horizontal_spacing=0.12
)

# Ajouter les traces
for trace in fig_pre.data:
    fig.add_trace(trace, row=1, col=1)
for trace in fig_pendant.data:
    fig.add_trace(trace, row=1, col=2)
for trace in fig_post.data:
    fig.add_trace(trace, row=1, col=3)

# --- Légende unique ---
seen = set()
for tr in fig.data:
    name = tr.name
    tr.legendgroup = name
    if name in seen:
        tr.showlegend = False
    else:
        tr.showlegend = True
        seen.add(name)

# --- Mise en forme globale ---
fig.update_layout(
    title_text="<b>Comparaison des rendements et volatilités des ETF énergétiques avant, pendant et après la crise du Covid</b>",
    title_x=0.5,
    title_font=dict(size=18),
    font=dict(size=12),
    height=600,
    width=1800,
    margin=dict(l=60, r=40, t=80, b=80),
    plot_bgcolor="white",
    paper_bgcolor="white",
    legend_title_text="Type d'énergie",
    legend=dict(
        orientation="h",
        y=-0.18,
        x=0.5, xanchor="center",
        bgcolor="rgba(255,255,255,0.7)",
        bordercolor="lightgray",
        borderwidth=1
    )
)

# --- Axes indépendants pour chaque graphe (comme dans ton code d’origine) ---
for i in range(1, 4):
    fig.update_xaxes(
        title_text="Volatilité annuelle (%)",
        gridcolor="lightgray",
        zeroline=True, zerolinecolor="lightgray",
        row=1, col=i
    )
    fig.update_yaxes(
        title_text="Rendement annuel (%)",
        gridcolor="lightgray",
        zeroline=True, zerolinecolor="lightgray",
        row=1, col=i
    )

show_embed(fig)
Out[10]:

En résumé : le rebond amorcé par les énergies vertes après la crise Covid n’est toujours pas pleinement consolidé en 2024. Le graphique montre que ces actifs présentent encore un rendement négatif associé à une volatilité plus élevée que celle des énergies fossiles. Cette différence s’explique par la stabilité relative du pétrole sur le long terme, même si, en période de crise, il réagit violemment avec un rendement pouvant atteindre -22 % en 2020, ce qui représente une perte majeure pour les investisseurs. À l’inverse, sur une période plus calme comme la phase pré-Covid, les énergies vertes se distinguent par un meilleur couple rendement/risque, les rendant plus attractives dans un contexte de marché stable.

✅ Conclusion

L’analyse des trois ETF étudiés IXC (énergies fossiles), ICLN (énergies renouvelables) et LIT (stockage de l’énergie) met en évidence des dynamiques de marché contrastées entre les différentes formes d’énergie.

Corrélations & régimes de marché
  • Avant Covid-19 : corrélations relativement fortes → évolution commune portée par la croissance mondiale.
  • Après la pandémie : affaiblissement partiel, surtout entre fossiles et nouvelles technologies → diversification accrue du secteur, changement de tendance
Performances & moteurs
  • Renouvelables (ICLN) & Stockage (LIT) : forte progression post-crise, soutenue par la transition énergétique et l’investissement vert.
  • Fossiles (IXC) : rebond marqué en 2022, mais profil plus volatil et sensible au contexte géopolitique.
Implications pour l’investisseur
🎯 Cap long terme (croissance/transition)
  • Privilégier ICLN & LIT (potentiel de croissance + thèse structurelle).
  • Viser une exposition progressive et diversifiée.
🛡️ Court terme / couverture
  • IXC pertinent comme hedge face aux chocs énergétiques.
  • Surveiller la volatilité et le contexte géopolitique.